<?php
/*
 * Ok, este closure tiene como objetivo ser utilizado en el 'inyectInto' del rowset.
 * El inyectInto precisa que se devuelva el resultado de la aplicación a cada fila para acumularlo. 
 *
 * Uso:
 * 		En los parametros es obligatorio que este $result, de no estar se considera que el codigo
 * es una expresión y se agrega.
 * 		En caso de que se considere una expresión, el codigo final sería: 
 * 		$result = {codigo_del_closure}; return $result;
 *  	El uso del return esta prohibido, ya que es necesario retornar el valor $result para mantener
 *  el estado en las sucesivas aplicaciones
 *
 *
 * */

class Exts_Closures_InyectClosure extends Exts_Closures_Closure {
	protected $_isAnExpression = false;

	/*
	 * Si no se encuentra la variable result se agrega a mano.
	 **/
	public function __construct($variables, $code) {
		if (strpos($code,'$result')) {
			parent::__construct($variables, $code);
		}
		else {
			parent::__construct($variables .', $result', $code);
			$this->_isAnExpression = true;
		}
	}
	/*
	 * Si es una expresión se agrega al codigo el $result 
	 **/
	protected function _getCode() {
		if ($this->_isAnExpression) {
			return ' $result = ' . $this->_code;
		}
		return $this->_code;
	}

	/*
	 * Si el codigo tiene la palabra clave return se arroja una excepción. 
	 * Sino se agrega la linea
	 * 		return $result;
	 *  al final.
	 * */
	protected function _makeCode() {
		$code = parent::_makeCode();
		if (strpos($code,' return')) {
			throw new Exts_Exception("¡InyectClosure no admite el uso de return en el codigo!");
		}
		$code .= ' return $result;' ; 
		return $code;
	}



}